#include <iostream>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Category.hh>
using std::cout;
using std::endl;
using namespace log4cpp;

void test(){
    //创建了一个日志输出的目的地i
    //第一个参数也是可以随便写；第二个参数表示的是输出流对象的指针
    OstreamAppender * ap1 = new OstreamAppender("console", &cout);
    
    //设置了输出的日志布局，格式化
    PatternLayout * pl = new PatternLayout();
    pl->setConversionPattern("%d %c [%p] %m%n");
    //将输出的目的地和格式化输出的日志布局产生关联
    ap1->setLayout(pl);

    //设置日志记录器
    Category & root = Category::getRoot();
    //这一步是将日志记录器Category和优先级 过滤器产生关联
    //root.setPriority(Priority::DEBUG);
    root.setPriority(Priority::INFO);
    //日志记录器和appender目的地产生关联
    root.setAppender(ap1);

    //日志
    //系统产生的日志
    //每一条日志本身也是有级别的
    //日志记录器本身也设置了一个priority优先级
    //只有日志的优先级高于日志记录器的优先级
    //那么日志才会输出
    root.debug("this is a debug message");
    root.info("this is a info message");
    root.notice("this is a notice message");
    root.warn("this is a warn message");
    root.error("this is an error message");
    root.crit("this is a crit message");
    root.alert("this is a alert message");
    root.fatal("this is a fatal message");

}

void test2(){

    //这里面两个参数：第一个参数可以随意设置，第二个参数表示的是
    //日志输出到file.log文件中
    FileAppender * ap2 = new FileAppender("file", "file.log");

    //设置了输出的日志布局，格式化
    PatternLayout * pl = new PatternLayout();
    pl->setConversionPattern("%d %c [%p] %m%n");
    //将输出的目的地和格式化输出的日志布局产生关联
    ap2->setLayout(pl);

    
    //设置日志记录器
    Category & root = Category::getRoot();
    //这一步是将日志记录器Category和优先级 过滤器产生关联
    //root.setPriority(Priority::DEBUG);
    root.setPriority(Priority::INFO);
    //日志记录器和appender目的地产生关联
    root.setAppender(ap2);


    root.debug("this is a debug message");
    root.info("this is a info message");
    root.notice("this is a notice message");
    root.warn("this is a warn message");
    root.error("this is an error message");
    root.crit("this is a crit message");
    root.alert("this is a alert message");
    root.fatal("this is a fatal message");
}

void test3(){

    //第一个参数可以随便写；第二个参数表示的是输出的文件名称
    //第三个参数代表单个日志文件只可以存储1MB大小，如果超出1M则会生成一个新的
    //文件；第四个参数表示的是日志文件的个数，如果是9，那么最终总文件数就是9+1
    RollingFileAppender * ap3 = new RollingFileAppender("rollingFile",
                                                        "wd.log",                                                      1024 * 1024,
                                                        9);


    //设置了输出的日志布局，格式化
    PatternLayout * pl = new PatternLayout();
    pl->setConversionPattern("%d %c [%p] %m%n");
    //将输出的目的地和格式化输出的日志布局产生关联
    ap3->setLayout(pl);

    
    //设置日志记录器
    Category & root = Category::getRoot();
    //这一步是将日志记录器Category和优先级 过滤器产生关联
    //root.setPriority(Priority::DEBUG);
    root.setPriority(Priority::INFO);
    //日志记录器和appender目的地产生关联
    root.setAppender(ap3);


    root.debug("this is a debug message");
    root.info("this is a info message");
    root.notice("this is a notice message");
    root.warn("this is a warn message");
    root.error("this is an error message");
    root.crit("this is a crit message");
    root.alert("this is a alert message");
    root.fatal("this is a fatal message");
}

int main()
{
    test3();
    return 0;
}


